<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>

        const obj = {
            uname: '只因',
            age: 2.5,
            hobbit: ['sing', 'dance', 'rap', 'basketball'],
            fans: {
                uname: 'ikun',
                age: 9999,
                hobbit: ['smoke', 'drink', , [0]],
            },
            fn: function () {
                return this
            },
        }
        // 拷贝后的容器
/*         const newObj = {}
        // 封装深拷贝函数
        function deepClone(newObj, oldObj) {
            for (const key in oldObj) {
                // 根据原数据的数据类型来进行新数据的拷贝方式
                if (oldObj[key] instanceof Array) {
                    // 该项数据类型为数组，所有定义一个空数组来放置即将拷贝的数据
                    newObj[key] = []
                    // 使用递归函数对原对象该属性进行二次拷贝
                    deepClone(newObj[key], oldObj[key])
                } else if (oldObj[key] instanceof Object) {
                    // 该项数据类型为对象，所有定义一个空对象来放置即将拷贝的数据
                    newObj[key] = {}
                    // 使用递归函数对原对象该属性进行二次拷贝
                    deepClone(newObj[key], oldObj[key])
                } else {
                    // 基本数据类型;直接进行赋值
                    newObj[key] = oldObj[key]
                }
            }
        } */
/*         deepClone(newObj, obj)
        // console.log(newObj)
        // console.log(obj.fn())
        console.dir(obj.fn.prototype.constructor === obj.fn)
        console.dir(obj.__proto__ === Object.prototype)
        console.dir(obj.__proto__ === obj.fn.__proto__.__proto__)
        console.dir(Function.prototype === obj.fn.__proto__)
        console.dir(Function.prototype === Function.__proto__)
        console.dir(obj.__proto__.__proto__ === null)
        console.dir(obj.fn.prototype.__proto__.constructor === Object)
        console.dir(obj.fn.__proto__.__proto__ === Object.prototype)
        console.dir(newObj.__proto__ === obj.__proto__)
        console.dir(obj.__proto__ === Object.prototype)
        console.dir(obj.__proto__.constructor === Object)
        console.dir(Object.prototype === obj.fn.__proto__.__proto__)
        console.dir(obj.__proto__.constructor.__proto__ === Function.prototype)
        console.dir(
            obj.__proto__.constructor.__proto__.__proto__ === Object.prototype
        )
        // Object.prototype ==>  Object  ==>  Function.prototype  ==>  Object.prototype  ==> null
        console.dir(
            obj.__proto__.constructor.__proto__.__proto__.__proto__ === null
        ) */

        const feng = JSON.parse(JSOM.stringify(obj))
    </script>
</body>

</html>